轉型指的是型別轉換,狹義來說是指string轉int這種轉型,但是幾天的文章下來我們已經知道型別就是類別,正確來說我們要談的是類別與類別間之間轉換,感覺寫不完拆成上下兩篇好了
轉換運算子指兩者沒有繼承關係者可以透過轉換運算子進行轉型,C#原始型別定義好的轉型運算子之外,我們也可以用implicit(隱含)或explicit(明確)實作自訂類別的轉換運算子。例如int、short是各自獨立的型別,
例如:
short s = 123;
int i1 = (int)s; //(明確轉換)
// 又整數型別int長度是4位元組,比整數型別short大兩個位元組,可以使用隱含轉換
int i2 = s; //(隱含轉換)
//但是int長度比short長,若要強制轉成int,需要明確轉換,伴隨而來的風險是數值遺失
short s2 =(short) 123456;
字串轉實值型別是很常見的需求,C#的實值型別int、double等都有實作Parse、TryParse方法將字串轉換成數值型別。
int i = int.Parse("123"); //直接轉型,失敗就會出錯。
TryParse會用到out字符把變數地址過去,實際結果是TryParse對直接去變數地址修改,失敗則得0,其餘結果則轉型成功
昨天談到參考型別與實值型別,繼承System.Object的是參考型別,繼承System.ValueType的是實值型別,但是System.ValueType也是繼承自System.Object,所以我們說.net中每個東西都是物件,而像是int與double等實值型別便可以轉換成object,實值型別物件是放在記憶體的stack(堆疊)區,若轉成object成為參考型別物件會放置於記憶體的heap(堆積)區,而這個記憶體操作過程被稱為boxing(裝箱)。相反地,將參考型別物件轉換成實值型別的記憶體操作過程稱為unboxing(拆箱)。